集装箱问题(回溯法)

#include <stdio.h>
#define N 3

int w[3]={10,40,40};//3个物体的载重量
int c=70;//轮船的总载重量
int cw ; //当前获得的载重量
int bestw ;// 最优的载重量
int r=90; //剩余箱子的总重量
int x[3]={0}; //记录某一个可行解的路径
int bestx[3]={0};//记录最优解的路径

void backtrack(int  i)//i表示树的层数
{

   if( i>N   )
   {
    if (cw >  bestw)
    {
     
     for(int j=0;j<N;j++)
     {
          bestw = cw; //可能有多个可行解,在每次找到可行解后都要更新最优解
    bestx[j]=x[j];//记录最优解的路径
     }

    }
    return;//结束最后一层的函数,回溯到上一层进行递归调用
 
   }
   r -=  w[i-1];
   if( cw + w[i-1] <= c)//x[i-1]=1
   {
       cw  +=  w[i-1];
       x[i-1]=1;
    backtrack(i+1);
    cw  -=   w[i-1];//回溯到上一层又要把当前总载重量减掉
   }

   if( cw+r > bestw)//上界函数,如果当前重量加上剩余的最大重量都小于当前最优解的重量
   {
      x[i-1]=0;
     backtrack(i+1);

   }
    r +=  w[i-1]  ;
   

}

void main()
{
   int i;
  backtrack(1);
  for(i=0;i<N;i++)
   printf("%d\n",bestx[i]);
  printf("%d\n",bestw);

    
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
装载问题是一个典型的回溯法问题。其实现过程可以分为以下几个步骤: 1. 读入数据,包括集装箱数量、集装箱体积、船的载重量。 2. 从第一个集装箱开始,依次判断它是否能够被装载。如果能够被装载,则继续考虑下一个集装箱;否则,回溯到上一个集装箱,尝试其他的选择。 3. 当所有的集装箱都被考虑完毕,或者当前船已经达到最大载重量时,记录当前的可行解。 4. 继续回溯,寻找更优的解。 下面是该问题的一个Java实现: ```java import java.util.Scanner; public class Main { static int n; // 集装箱数量 static int[] w; // 集装箱体积 static int c; // 船的载重量 static int[] x; // 当前选择的集装箱 static int cw; // 当前船的载重量 static int bestw; // 最优载重量 static int r; // 剩余集装箱的体积 static void backtrack(int i) { if (i > n) { // 达到叶子节点 if (cw > bestw) { bestw = cw; } return; } r -= w[i]; // 尝试选择第i个集装箱 if (cw + w[i] <= c) { // 如果可以装载 x[i] = 1; cw += w[i]; backtrack(i + 1); // 考虑下一个集装箱 cw -= w[i]; // 回溯 } if (cw + r > bestw) { // 如果不装载第i个集装箱,仍有可能成为最优解 x[i] = 0; backtrack(i + 1); } r += w[i]; // 回溯 } public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); w = new int[n + 1]; x = new int[n + 1]; for (int i = 1; i <= n; i++) { w[i] = sc.nextInt(); r += w[i]; } c = sc.nextInt(); backtrack(1); System.out.println(bestw); } } ``` 在该实现中,`backtrack`函数表示回溯的过程。它的参数`i`表示当前正在选择第`i`个集装箱。 在函数的开头,如果已经考虑完了所有的集装箱,或者当前船已经达到最大载重量,就记录当前的可行解。 接着,尝试选取第`i`个集装箱。如果它可以被装载,则将`x[i]`设为1,更新当前船的载重量`cw`,并考虑下一个集装箱。 如果第`i`个集装箱不能被装载,则回溯到上一个集装箱,尝试其他的选择。 如果不装载第`i`个集装箱,仍有可能成为最优解,因此继续考虑下一个集装箱。 最后,在回溯的过程中,需要不断更新剩余集装箱的体积`r`。 运行该程序,输入以下测试数据: ``` 5 2 2 6 5 4 10 ``` 输出结果为: ``` 10 ``` 表明最优载重量为10。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值